import axios from 'axios'

const isDev = process.env.NODE_ENV === 'development'

const ins = axios.create({
  // 开发环境下 没有输入，是因为 使用了 代理解决跨域问题
  // 反向代理解决跨域问题，只能在开发环境下解决问题
  // 生产环境下依靠后段解决跨域问题（将前端代码放到后端接口服务器，后端代码体现无跨域）
  // 将前端代码放到后端接口服务器 ==》 同协议  同域名  同端口
  // 将前端代码放到不同于后端接口服务器， 后端代码体现无跨域
  /**
   * 
   * app.all("*",function(req,res,next){
      //设置允许跨域的域名，*代表允许任意域名跨域
      // res.header("Access-Control-Allow-Origin", "http://localhost:8081"); // 白名单
      res.header("Access-Control-Allow-Origin","*");
      //允许的header类型， content-type
      res.header("Access-Control-Allow-Headers","*");
      //跨域允许的请求方式
      res.header("Access-Control-Allow-Methods","DELETE,PUT,POST,GET,OPTIONS");
      next();
    });
   */
  baseURL: isDev ? '' : 'http://121.89.205.189:3001/admin',
  timeout: 6000
})

// 拦截器
// 请求拦截器
ins.interceptors.request.use((config) => {
  config.headers.token = localStorage.getItem('token') || ''
  return config
}, error => Promise.reject(error))

// 响应拦截器
ins.interceptors.response.use((response) => {
  if (response.data.code === '10119') {
    localStorage.setItem('loginState', false)
    // 无效登录 需要跳转至登录页面
    // window.location.href = "/login"  // BrowserRouter 路由
    window.location.href = "/#/login"  // HashRouter 路由
    return response
  }
  return response
}, error => Promise.reject(error))

// 自定义各种数据请求 axios({})
export default function request (config) {
  const { url = '', method = 'GET', data = {}, headers = {} } = config
  switch (method.toUpperCase()) {
    case 'GET':
      return ins.get(url, { params: data })
    case 'POST':
      // 表单提交  application/x-www-form-url-encoded
      if (headers['content-type'] === 'application/x-www-form-url-encoded') {
        // 转参数 URLSearchParams/第三方库qs
        const p = new URLSearchParams()
        for (const key in data) {
          p.append(key, data[key])
        }
        return ins.post(url, p, { headers })
      }
      // 文件提交  multipart/form-data
      if (headers['content-type'] === 'multipart/form-data') {
        const p = new FormData()
        for (const key in data) {
          p.append(key, data[key])
        }
        return ins.post(url, p, { headers })
      }
      // 默认 application/json
      return ins.post(url, data)
    case 'PUT': // 修改数据 --- 所有的数据的更新
      return ins.put(url, data)
    case 'DELETE': // 删除数据
      return ins.delete(url, { data })
    case 'PATCH': // 更新局部资源
      return ins.patch(url, data)
    default:
      return ins(config)
  }
}